//阮一峰版本
var quickSort = function (arr) {
    if (arr.length <= 1) {
        return arr;
    }
    var pivotIndex = Math.floor(arr.length / 2);
    //在js中splice会对数组进行一次拷贝的操作，而它最坏的情况下复杂度为O(n)，而O(n)代表着针对数组规模的大小进行了一次循环操作。
    var pivot = arr.splice(pivotIndex, 1)[0];
    var left = [];
    var right = [];

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([pivot], quickSort(right));
};

var quickSort1 = function(arr,left,right){

    // 如果左边界比右边界大，返回结果，排序结束
    if(left>right){
      return;
    }
  
    // 默认值处理，如果有传入left和right参数，就赋值这个参数，否则就赋值后面的默认值
    left=left||0;
    right=right||arr.length-1;
  
    // 定义移动的左游标和右游标
    var leftPoint=left;
    var rightPoint=right;
  
    // 定义一个基准数
    var temp=arr[left];
  
    // 判断左右游标是否重合，如果重合，循环结束
    while(leftPoint!=rightPoint){
  
      // 基准数在左边，因此从右边开始一个个扫描
      // 从右到左，寻找小于基准数的数，且左游标要小于右游标
      // 如果数字大于基准数（证明不符合条件），寻找下一个
      // 直到找到比基准数小的数，游标停止递减
      while(arr[rightPoint]>=temp&&leftPoint<rightPoint){
        rightPoint--;
      }
      // 从左到右，寻找大于基准数的数，且左游标要小于右游标
      // 如果数字小于基准数（证明不符合条件），寻找下一个
      // 直到找到比基准数小的数，游标停止递增
      while(arr[leftPoint]<=temp&&leftPoint<rightPoint){
        leftPoint++;
      }
  
      // 如果左游标小于右游标，则交换两个数字的位置
      if(leftPoint<rightPoint){
        var changeNumber=arr[leftPoint];
        arr[leftPoint]=arr[rightPoint];
        arr[rightPoint]=changeNumber;
      }
      // 进行下一次循环，直到两个游标重合位置
    }
  
    // 重合之后，交换基准数
    arr[left]=arr[leftPoint];
    arr[leftPoint]=temp;
  
    // 递归操作左右两个数组
    quickSort1(arr,left,leftPoint-1);
    quickSort1(arr,leftPoint+1,right);
  
    return arr;
  };
  var numArr=[6,1,2,7,9,4,5,10,8];
  console.log(quickSort(numArr));